<?php 
//Класс страницы
class Page extends Elog_use
{
//Основные параметры берутся из базы
	public $id=false;//Уникальный идентификатор страницы
	public $parents='';//Список родителей страницы
	public $url=false;//Часть урл - название страницы вида url
	public $templ=false;//Тип страницы, указывает на использование шаблона
	public $title='';//Основной заголовок страницы
	public $h1='';//Текст тега <h1>
	public $text1='';//Основной текст
	public $text2='';//Дополнительный текст
	
	public $creator_id='';//Идентификатор создателя страницы
	public $editor_id='';//Идентификатор последнего редактора страницы
	public $zin='';//Порядковый номер страницы
//Мета теги
	public $meta_title='';//Текст мета заголовка
	public $meta_description='';//Мета описание
	public $meta_keywords='';//Ключевые слова
	public $meta_accusative_case='';//Префикс к товару в винительном падеже. Пример: "мелкую бытовую технику"
	public $сat_plural='';//Категория во множественном числе
	public $meta_robots='';//Мета директива для поисковых роботов
	public $sys_header='';//Остальные участки кода добавляемые в тег Head
//Даты
	public $date_create=false;
	public $date_last_edit=false;
//Параметры шаблона 		
	public $need_chache=true;//Кешировать страницу
	public $js_on_load=array();//Скрипты запускаемые после загрузки страницы
//Генерируемые значения
	public $gText='';//Контентная часть страницы
	public $url_before=false;//Часть урл - до названия текущей страницы вида /parent1/parent2
	public $brand = '';  // Бренд
	public $brand_rus = '';  // Бренд на русском
	public $brand_id = '';// ID Бренда
	public $brand_url = '';// Url Бренда
	public $parents_arr=array();//Массив объектов страниц родителей
	public $paginator_index=0;//Порядковый номер страницы пагинатора
	public $links=array();//Ссылки 
	public $meta_hook=array();//Зацеп для генерации мета
	public $is_category = false;//Если не конечная категория
//Системные 
	protected $subdomen=false;/*Поддомен sd*/
	protected $subdomen_page=false;/*Страница поддомена sd*/
	protected $js_arr=array();//Массив инициализированных скриптов
	protected $css_arr=array();//Массив инициализированных стилей
	protected $attaches_arr=array();//Массив приложений
	protected $conn=false;//ссылка на объект DBConnector
	protected $cache=false;//ссылка на объект Cache

//Конструктор
	public function Page(&$conn,&$cache)
	{
		$this->configs=&$configs;
		$this->conn=&$conn;
		$this->cache=&$cache;
	}

//Заполнить объект значениями запроса
	protected function setPageFromQuery()
	{
		$row = $this->conn->fetch();
		if($row)
		{
			foreach($row as $i=>$val)
			{
				if(isset($this->$i))
					$this->$i=$val;
				else
					$this->add_log("Неиспользуемый параметр выведен из базы $i=>$val",DEE_NOTICE);
			}
			return true;
		}
		return false;
	}
	
//Страница по Идентификатору
	public function getPageById($id,$params=false)
	{
		$filter='';
		$fields='*';
		if($params)
		{
			if(isset($params['fields']) && $params['fields']!='')
				$fields=$params['fields'];
			if(isset($params['filter']) && $params['filter']!='')
				$filter=$params['filter'];
		}
		$sql="select $fields from pages where id = $id $filter";
		if($this->conn->query($sql))
		{
			if($this->conn->rowCount()!=0)
				$this->setPageFromQuery();
			else
				return false;
		}
		return true;
	}

//Страница по ссылке
	public function getPageByUrl( $filter = '', $url = false )  // lg-s24ahq
	{
		$sd_filter = '';
		if( !$url )  // Убираю GET часть запроса
			$url = str_replace( '?'.$_SERVER['QUERY_STRING'],'',$_SERVER['REQUEST_URI'] );
			
		if( preg_match( '#'.PAGINATOR_LINK.'(\d+)#', $url, $res ) )	{
			$this->paginator_index = $res[1]-1;
			$url = str_replace( PAGINATOR_LINK.$res[1],'', $url );
			if( $url == '' )
				$url = '/';
		}

		if( USE_SUBDOMENS )  // Поддомен второго уровня sd
		{
			if( preg_match( '#(w{3}\.|)([^\.]+)\.[^\.]+\.[^\.]+#', $_SERVER['HTTP_HOST'], $res ) )
			{
				$this->subdomen = $res[2];
				$url = '/'.$this->subdomen.($url!='/'?$url:'');
				$sd_filter .= " AND ( `parents` != '' OR ( `parents` = '' AND `templ` LIKE 'sd_%' ) )";
			}
			else 
				$sd_filter .= " AND `templ` NOT LIKE 'sd_%' ";
		}
		
		$links = array();  // Урл разбитый на страницы
		$lCount = 0;	
		$q = '1';
		$parents = '';

		if( $url == '/')
		{
			$q = '`templ` = \'_main\'';
		}
		else
		{
			$links = explode( '/', substr( $url, 1 ) );  //Разбиваю урл по страницам
			$lCount = count( $links );

				// Проверка на существование бренда в ссылке
			$this->conn->query('SELECT * FROM `store_product_brand` WHERE `url` = "'.$links[$lCount-1].'"', 0, 'brand');
			if( $row = $this->conn->fetch('brand') ) {
				$this->brand = $row->name;
				$this->brand_rus = $row->name_rus;
				$this->brand_id = $row->id;
				$this->brand_url = $row->url;
				array_pop( $links );
				$lCount -= 1;
			}

			if( $lCount )
			{
				$this->links = $links;
				$url_before = '';
				
				if( $lCount > 1 )  // Если ссылка не на первый уровень
				{
					$imploded_parents = implode( '\',\'', array_slice( $links, 0, $lCount - 1 ) );
					$this->conn->query("SELECT * FROM `pages` WHERE `url` IN ('$imploded_parents') $filter $sd_filter ORDER BY `parents`");
					$allRight = true;
					$prns = array();

					$foundCount = $this->conn->rowCount();  // В выдачем могут совпадать ссылки второго уровня и выше
					$trueParents = 0;
					for( $i=0; $i < $foundCount; $i++ )
					{
						$page = new Page( $this->conn, $this->cache );  //Страница родитель
						$page->setPageFromQuery();  //Заполняю следующим из запроса
						if( $i != 0 )  //Первый предок должен совпадать
						{
							if($prns[$trueParents-1]->parents.'#'.$prns[$trueParents-1]->id.'#' != $page->parents)
								continue;
						}
						elseif( $page->parents != '' )  // Не найден предок первого уровня
						{
							$allRight = false;
							break;
						}
						$prns[$trueParents] = $page;				
						
						$url_before .= '/'.$prns[$trueParents]->url;
						
							//Отсутствует ссылки или не соответствует порядку
						if( !isset( $links[$trueParents] ) || $links[$trueParents] != $prns[$trueParents]->url || $parents != $prns[$trueParents]->parents )
						{
							$allRight = false;
							break;
						}
						else
							$parents .= '#'.$prns[$trueParents]->id.'#';
							
						$trueParents++;
						if( $trueParents == ( $lCount - 1 ) )break;
					}
					
					if( $allRight )  // Все предыдущие страницы найдены
					{
						if($this->subdomen)  // sd
						{
							$this->subdomen_page=array_shift($prns);
							$url_before=str_replace('/'.$this->subdomen,'',$url_before);
						}
						$this->parents_arr=$prns;
					}
					else
					{						
						$this->templ = '_404';
						return false;
					}					
				}
				$this->url_before = $url_before;

				$q = "`url` = '{$links[$lCount-1]}' AND `templ` != '_main' AND `parents` = '$parents'";  //  Целевая страница
			}
			else
			{
				if( $this->brand )
				{
					$q = '`templ` = \'brand\'';
				}
				else
				{
					$this->templ = '_404';
					return false;
				}
			}
		}
		if(!$this->subdomen && $lCount==1)  // sd
		{
			$filter.=' AND `templ` NOT LIKE \'sd_%\'';
		}
		if( $this->conn->query( "SELECT * FROM `pages` WHERE $q $filter LIMIT 1" ) )
		{
			if($this->setPageFromQuery())					
				return true;		
			$this->templ='_404';
			return false;				
		}
		$this->templ='_404';
		return false;
	}
	
//Выдать обекты родители
	public function getParentsArr( $fields = '*' )
	{
		if(!$this->parents_arr)
		{
			$parIds=getIdsArr($this->parents);				
			$Count=count($parIds);	
			$preUrl='';
			$parents='';				
			if($Count >0)//если ссылка не на первый уровень
			{	
				$this->conn->query("select $fields from pages where id in (".implode(',',$parIds).") order by parents");
				$prns=array();
				for($i=0;$i<$Count;$i++)
				{
					$prns[$i]=new Page();//Страница родитель
					$prns[$i]->setPageFromQuery();//Заполняю следующим из запроса
					$preUrl.='/'.$prns[$i]->url;
					$parents.='#'.$prns[$i]->id.'#';
				}
				if($parents==$this->parents)
					$this->parents_arr=$prns;
				else 
					return false;
			}
		}
		else
			return $this->parents_arr;
	}

//Получить список аттачей
	public function getAttaches($pages_ids=false,$names=false)
	{
		/*Формирую массив список идентификаторов страниц, для которых запрошены аттачи*/
		if(!$pages_ids)
			$pages_ids=array($this->id);
		elseif(!is_array($pages_ids))
			$pages_ids=array($pages_ids);
		/*Формирую список идентификаторов страниц, аттачи которых запрошены в первый раз */
		$to_request=array();
		foreach($pages_ids as $p_id)
			if(!isset($this->attaches_arr[$p_id]))
				$to_request[]=$p_id;
		/*Если задан фильтр названий аттачей преобразую в массив*/
		if($names && !is_array($names))
			$names=array($names);
		if($to_request)
		{			
			$to_request=implode(',',$to_request);
			$this->conn->query("select page_id,name,params from pages_attachments where page_id in($to_request) ");
			while($row=$this->conn->fetch())
			{
				$row->params=@unserialize($row->params);				
				if(!empty($row->params))
					$this->attaches_arr[$row->page_id][]=$row;
			}			
		}
		$res=array();
		/*формирую выдачу*/
		foreach($pages_ids as $p_id)
			/*В случае отсутствия аттачей для страницы, для избежания повторного запроса инициализирую */
			if(!isset($this->attaches_arr[$p_id]))
				$this->attaches_arr[$p_id]=false;
			elseif($this->attaches_arr[$p_id])
				foreach($this->attaches_arr[$p_id] as $att)
				{
					/*Фильтр*/
					if(!$names)
						$res[$att->name]=$att->params;
					elseif(in_array($att->name,$names))
					{
						if($res[$att->name])
							$res[$att->name]=array_merge($res[$att->name],$att->params);
						else
							$res[$att->name]=$att->params;
					}
				}
		return $res;
	}
//Добавить скрипты
	public function js($name,$url=false)
	{
		if(!isset($this->js_arr[$name]))//Если еще не добавлен
		
			$this->js_arr[$name]='<script type="text/javascript" src="'.($url?$url:'/'.INCLUDES_FOLDER.'/js/'.$name.'.js').'"></script>';			
	}
	
//Добавить Стили
	public function css($name,$url=false)
	{
		if(!isset($this->css_arr[$name]))//Если еще не добавлен
			$this->css_arr[$name]='<link rel="stylesheet" type="text/css" href="'.($url?$url:'/'.INCLUDES_FOLDER.'/css/'.$name.'.css').'" media="all" />';
	}

//Вывод для тега <head>
	public function printHead()
	{
		echo '<title>',(($this->meta_title)?$this->meta_title:$this->title),'</title>';	
		foreach(array('description','keywords','robots') as $val)
		{		
			$meta='meta_'.$val;
			if($this->$meta!='')
				echo '
	<meta name="'.$val.'" content="'.$this->$meta.'" />';
		}
		echo implode($this->css_arr)
			,implode($this->js_arr)
			,$this->sys_header;			
	}
	

	
//Вывод h1
	public function printH1($return=false)
	{
		$h1='';
		if($this->h1=='')
			$h1= $this->title;	
		else
			$h1=$this->h1;		
		if(!$return)
			echo '
					<h1 class="big-title">'.$h1.'</h1>
					';
		else 
			return '
					<h1 class="big-title">'.$h1.'</h1>
					';
	}


	public function printOnLoadJS() //  Скрипты запускаемые после загрузки страницы
	{
		if( $this->js_on_load )
		echo'<script type="text/javascript">$(document).ready(function(){',implode("\r\n",$this->js_on_load),'});</script>';
	}

	public function getCrumbs( $main = 'Главная' )  // "Хлебные крошки"
	{
		$url = '';
		$crumbs[] = array( 'title' => $main, 'link' => '/' );

		foreach( $this->parents_arr as $par )
			$crumbs[] = array( 'title' => $par->title, 'link' => $url .= '/'.$par->url );
		
		if( $this->templ == 'product' ) {
			$this->conn->query('SELECT b.* FROM store_products_view AS p LEFT JOIN store_product_brand AS b ON p.brand_id = b.id WHERE p.page_id = '.$GLOBALS['view']->id );
			if( $row = $this->conn->fetch() )
				$crumbs[] = array( 'title' => $row->name, 'link' => $url.'/'.$row->url );
			else
				$this->templ == '_404';
		}
		$crumbs[] = array( 'title' => $this->title, 'link' => $url .= '/'.$this->url );
		
		if( $this->brand )
			$crumbs[] = array( 'title' => $this->brand, 'link' => $url .= '/'.$this->brand_url );
		
		return $crumbs;
	}

	function quickMessage( $text, $type = DEE_NOTICE )  // Вывести быстрое сообщение
	{
		$this->js_on_load[] = 'dee_corner.quick_message("'.$text.'","'.$type.'");';
	}
	
	function getDomenUrl($url,$subdomen=false)  // Генератор ссылки для поддоменов sd
	{
		if($subdomen=='domen')
		{
			if($this->subdomen)
				$url='http://'.USE_SUBDOMENS.$url;
		}
		elseif($this->subdomen && $subdomen && $subdomen!=$this->subdomen)
		{
			$url.="http://$subdomen.".USE_SUBDOMENS.$url;
		}
		return $url;
	}
}
